package com.hy.wxConfig;

import com.github.wxpay.sdk.WXPayUtil;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
@Component
public class MyWxPayUtil {

    public static void main(String[] args) throws Exception {
        String string = UUID.randomUUID().toString().replace("-", "").substring(0, 32);
        // 示例调用
        String qrCodeUrl = generateQrCode("速度向-》>高雨航付款", string, "1");
        System.err.println("二维码链接地址：" + qrCodeUrl);
    }

    public static String generateQrCode(String body, String outTradeNo, String totalFee) throws Exception {
        // 创建一个HttpClient实例，指定微信支付的统一下单接口URL
        HttpClient httpClient = new HttpClient("https://api.mch.weixin.qq.com/pay/unifiedorder");
        // 设置HttpClient使用HTTPS协议，确保数据传输的安全性
        httpClient.setHttps(true);
        // 创建一个Map对象，用于存储请求参数
        Map<String, String> map = new HashMap<>();
        // 设置微信支付的应用ID（公众号或小程序的ID）
        map.put("appid", "wxab8acb865bb1637e");
        // 设置商户号，用于唯一标识商户
        map.put("mch_id", "11473623");
        // 设置随机字符串，用于防止请求被重放
        map.put("nonce_str", WXPayUtil.generateNonceStr());
        // 设置商品描述，说明本次交易的商品或服务内容
        map.put("body", body);
        // 设置商户系统中的订单号，用于标识订单
        map.put("out_trade_no", outTradeNo);
        // 设置订单金额，单位是分
        map.put("total_fee", totalFee);
        // 设置支付请求发起的客户端IP地址
        map.put("spbill_create_ip", "127.0.0.1");
        // 设置支付结果通知的回调地址，支付完成后会向该地址发送支付结果
        map.put("notify_url", "127.0.0.1");
        // 设置交易类型，"NATIVE" 表示扫码支付
        map.put("trade_type", "NATIVE");
        // 将请求参数转化为XML格式，并生成签名，使用商户的API密钥进行签名
        httpClient.setXmlParam(WXPayUtil.generateSignedXml(map, "2ab9071b06b9f739b950ddb41db2690d"));
        // 发送POST请求，调用微信支付的统一下单接口
        httpClient.post();
        // 获取微信支付接口返回的响应内容，通常是XML格式的字符串
        String result = httpClient.getContent();
        // 将微信支付接口返回的XML结果转换为Map对象，方便提取支付信息
        Map<String, String> resultMap = WXPayUtil.xmlToMap(result);
        // 检查resultMap是否为null，以及code_url是否存在
        if (resultMap == null || !resultMap.containsKey("code_url")) {
            // 打印微信支付接口返回的完整响应内容，用于调试
            System.err.println("微信支付接口返回的完整响应内容：" + result);
            throw new RuntimeException("微信支付接口调用失败，未返回有效的二维码链接。");
        }
        // 从Map中提取二维码的URL地址，供用户扫描支付
        return resultMap.get("code_url").toString();
    }

    public static String checkOrder(String no) throws Exception {
        // 创建一个HttpClient实例，指定微信支付的订单查询接口URL
        HttpClient httpClient = new HttpClient("https://api.mch.weixin.qq.com/pay/orderquery");
        // 设置HttpClient使用HTTPS协议，确保数据传输的安全性
        httpClient.setHttps(true);

        // 创建一个Map对象，用于存储请求参数
        Map<String, String> map = new HashMap<>();
        // 设置微信支付的应用ID（公众号或小程序的ID）
        map.put("appid", "wxab8acb865bb1637e");
        // 设置商户号，用于唯一标识商户
        map.put("mch_id", "11473623");
        // 设置随机字符串，用于防止请求被重放
        map.put("nonce_str", WXPayUtil.generateNonceStr());
        // 设置商户系统中的订单号，用于标识订单
        map.put("out_trade_no", no);

        // 将请求参数转化为XML格式，并生成签名，使用商户的API密钥进行签名
        httpClient.setXmlParam(WXPayUtil.generateSignedXml(map, "2ab9071b06b9f739b950ddb41db2690d"));
        // 发送POST请求，调用微信支付的订单查询接口
        httpClient.post();

        // 获取微信支付接口返回的响应内容，通常是XML格式的字符串
        String result = httpClient.getContent();
        // 将微信支付接口返回的XML结果转换为Map对象，方便提取支付信息
        Map<String, String> resultMap = WXPayUtil.xmlToMap(result);

        // 检查resultMap是否为null，以及返回码（return_code）和订单状态（trade_state）是否有效
        if (resultMap == null || !resultMap.containsKey("trade_state")) {
            // 打印微信支付接口返回的完整响应内容，用于调试
            System.err.println("微信支付接口返回的完整响应内容：" + result);
            throw new RuntimeException("微信支付接口调用失败，未返回有效的订单状态。");
        }

        // 获取订单状态（trade_state），可能的值有：SUCCESS, REFUND, NOTPAY, CLOSED, PAYERROR
        String tradeState = resultMap.get("trade_state");

        // 根据订单状态返回相应的结果
        switch (tradeState) {
            case "SUCCESS":
                return "SUCCESS";  // 支付成功
            case "REFUND":
                return "REFUND";   // 退款
            case "NOTPAY":
                return "NOTPAY";   // 未支付
            case "CLOSED":
                return "CLOSED";   // 订单已关闭
            case "PAYERROR":
                return "PAYERROR"; // 支付错误
            default:
                return "UNKNOWN";  // 其他未知状态
        }
    }
}